/**
 * Copyright Choonho Son ,choonho.son(at)kt(dot)com
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.oracle.em12c.command;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Hashtable;

import javax.net.ssl.HttpsURLConnection;

import com.google.gson.Gson;
import com.oracle.em12c.api.Element;
import com.oracle.em12c.api.ServiceTemplate;
import com.oracle.em12c.api.VM;
import com.oracle.em12c.api.VMStatus;
import com.oracle.em12c.command.ApiCommand;

public class ControlVM implements ApiCommand {
	private HttpsURLConnection conn;
	public ControlVM(HttpsURLConnection conn) {
		this.conn = conn;
	}
	
	public Element execute(Hashtable params) throws IOException {
		try {
			System.out.println("Execute ControlVM");
			
			HashMap param = new HashMap();
			// make body
			String status = (String)params.get("status");
			param.put("status", status);
			Gson gson = new Gson();
			String cmdStr = gson.toJson(param);
			
			System.out.println("json=" + cmdStr);
			
			this.conn.setDoOutput(true);
			this.conn.setDoInput(true);
			this.conn.setRequestMethod("PUT");
			
			this.conn.setRequestProperty("Content-Length", String.valueOf(cmdStr.length()));
			this.conn.setRequestProperty("Content-Type", "application/oracle.com.cloud.common.VM+json");
			this.conn.setRequestProperty("Accept", "application/oracle.com.cloud.common.VM+json?resourcest*");
			
			this.conn.connect();
			
			BufferedOutputStream bos = new BufferedOutputStream(this.conn.getOutputStream());
			OutputStreamWriter out = new OutputStreamWriter(bos);
			
			//System.out.println(cmdStr);
			out.write(cmdStr.toString());
			
			out.flush();
			
			System.out.println(this.conn.getResponseMessage());
			InputStream body;
			body = this.conn.getInputStream();
			//BufferedReader br = new BufferedReader(new InputStreamReader(body));
			int j;
			byte[] buff = new byte[1024];
			String result = "";
			while ( (j = body.read(buff)) > 0) {
				//System.out.println(j);
				result = result + new String(buff, 0, j);
			}
			System.out.println(result);
			VMStatus e = new Gson().fromJson(result, VMStatus.class);
			return e;
			
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		return new Element();
	}
}
